<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

<script>
    // 事件轮询(event loop)
    // 1. 先执行主线程上的同步任务, 异步任务放到任务队列(分宏任务和微任务)
    // 2. 主线所有同步任务执行完毕 => 清空微任务队列
    // 3. 微任务队列清空完毕 => 执行宏任务队列首位的任务(如果有多个宏任务,只执行一个  => 时间不同,谁快谁在队列首位 ,时间相同 => 先放的在队列首位 )  
    // 4. 重复 2 - 3  (宏任务单个执行完毕会再次清空微任务队列, 微任务队列清空完毕在执行宏任务队列首位的任务)


    // 总结
    // 1. 同步任务执行完毕 清空一次微任务队列
    //    每执行一个宏任务,再次清空微任务


    // 3 
    // 结果: 1 2 5 



    console.log(1);
    var p = new Promise(function (resolve, reject) { //同步任务
        console.log(2);
        resolve(3);
    })

    // Promise实例的方法 then 和catch 也是异步任务
    p.then(num => {
        console.log(num); // 3
    })

    setTimeout(function () {
        console.log(4);
    }, 0);

    console.log(5);



</script>

</html>